home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / resize_fat / fat.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  3.0 KB  |  138 lines

  1. package resize_fat::fat;
  2.  
  3.  
  4.  
  5.  
  6. use resize_fat::any;
  7. use resize_fat::io;
  8. use resize_fat::c_rewritten;
  9.  
  10. 1;
  11.  
  12. sub read($) {
  13.     my ($fs) = @_;
  14.  
  15.     resize_fat::c_rewritten::read_fat(fileno $fs->{fd}, $fs->{fat_offset}, $fs->{fat_size}, $fs->{media});
  16.  
  17.     @{$fs->{clusters}{count}}{qw(free bad used)} =
  18.       resize_fat::c_rewritten::scan_fat($fs->{nb_clusters}, $fs->{fs_type_size});
  19. }
  20.  
  21. sub write($) {
  22.     my ($fs) = @_;
  23.  
  24.     sysseek $fs->{fd}, $fs->{fat_offset}, 0 or die "write_fat: seek failed";
  25.     foreach (1..$fs->{nb_fats}) {
  26.     resize_fat::c_rewritten::write_fat(fileno $fs->{fd}, $fs->{fat_size});
  27.     }
  28. }
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36. sub allocate_remap {
  37.     my ($fs, $cut_point) = @_;
  38.     my ($cluster, $new_cluster);
  39.     my $remap = sub { resize_fat::c_rewritten::set_fat_remap($cluster, $new_cluster) };
  40.     my $get_new = sub {
  41.     $new_cluster = get_free($fs);
  42.     0 < $new_cluster && $new_cluster < $cut_point or die "no free clusters";
  43.     set_eof($fs, $new_cluster); 
  44.     
  45.     };
  46.  
  47.     resize_fat::c_rewritten::allocate_fat_remap($fs->{fat_size});
  48.  
  49.     $fs->{last_free_cluster} = 2;
  50.     for ($cluster = 2; $cluster < $fs->{nb_clusters} + 2; $cluster++) {
  51.     if ($cluster < $cut_point) {
  52.         if (resize_fat::c_rewritten::flag($cluster) == $resize_fat::any::DIRECTORY) {
  53.         &$get_new();
  54.         } else {
  55.         $new_cluster = $cluster;
  56.         }
  57.         &$remap();
  58.     } elsif (!is_empty(&next($fs, $cluster))) {
  59.         &$get_new();
  60.         &$remap();
  61.      }
  62.     }
  63. }
  64.  
  65.  
  66.  
  67. sub update {
  68.     my ($fs) = @_;
  69.  
  70.     for (my $cluster = 2; $cluster < $fs->{nb_clusters} + 2; $cluster++) {
  71.      if (resize_fat::c_rewritten::flag($cluster)) {
  72.          my $old_next = &next($fs, $cluster);
  73.          my $new      = resize_fat::c_rewritten::fat_remap($cluster);
  74.          my $new_next = resize_fat::c_rewritten::fat_remap($old_next);
  75.  
  76.          set_available($fs, $cluster);
  77.  
  78.          is_eof($old_next) ?
  79.          set_eof($fs, $new) :
  80.          set_next ($fs, $new, $new_next);
  81.      }
  82.     }
  83. }
  84.  
  85.  
  86. sub endianness16($) { (($_[0] & 0xff) << 8) + ($_[0] >> 8); }
  87. sub endianness($$) {
  88.     my ($val, $nb_bits) = @_;
  89.     my $r = 0;
  90.     for (; $nb_bits > 0; $nb_bits -= 8) {
  91.     $r <<= 8;
  92.     $r += $val & 0xff;
  93.     $val >>= 8;
  94.     }
  95.     $nb_bits < 0 and die "error: endianness only handle numbers divisible by 8";
  96.     $r;
  97. }
  98.  
  99. *next = \&resize_fat::c_rewritten::next;
  100. *set_next = \&resize_fat::c_rewritten::set_next;
  101.  
  102.  
  103.  
  104. sub get_free($) {
  105.     my ($fs) = @_;
  106.     foreach (my $i = 0; $i < $fs->{nb_clusters}; $i++) {
  107.         my $cluster = ($i + $fs->{last_free_cluster} - 2) % $fs->{nb_clusters} + 2;
  108.         is_available(&next($fs, $cluster)) and return $fs->{last_free_cluster} = $cluster;
  109.     }
  110.     die "no free clusters";
  111. }
  112.  
  113.  
  114. sub is_eof($) {
  115.     my ($cluster) = @_;
  116.     $cluster >= $resize_fat::bad_cluster_value;
  117. }
  118. sub set_eof($$) {
  119.     my ($fs, $cluster) = @_;
  120.     set_next ($fs, $cluster, $resize_fat::bad_cluster_value + 1);
  121. }
  122.  
  123.  
  124. sub is_empty($) {
  125.     my ($cluster) = @_;
  126.     $cluster == 0 || $cluster == $resize_fat::bad_cluster_value;
  127. }
  128.  
  129.  
  130. sub is_available($) {
  131.     my ($cluster) = @_;
  132.     $cluster == 0;
  133. }
  134. sub set_available($$) {
  135.     my ($fs, $cluster) = @_;
  136.     set_next ($fs, $cluster, 0);
  137. }
  138.